#!/usr/bin/php
<?
//
// Hjälpscript till webgränsnitt för USB-backuper
///////////////////////////////////

$BASEDIR = "/usr/share/uggla";
require "$BASEDIR/inc/functions.php";

$LOGFILE	= '/var/log/usb-backup.log';
$CONFFILE	= '/etc/rdiff-backup-usb';
$LOCKFILE       = '/var/run/uggla_rdiff_usb_backup.lock';
$LOCKFILE_CREATE= '/var/run/uggla_rdiff_usb_create.lock';
$BACKUPLINE	= '/usr/bin/rdiff-backup -b -v6 --force --exclude-if-present "NOBACKUP" --include-symbolic-links --exclude-special-files --print-statistics --exclude "/home/*/.Trash-*" --exclude "'.$LOGFILE.'"';

$children = array();
$children_pipes = array();
$shutdown_now = false;


/////
// kontrollerar anslutna usb-enheter tills någon hittas som är backupdisk (har 'rifnetbackup.txt'-fil)
/////
function get_backupdevice()
{
        //Letar efter monterade enheter
	$mounts = file('/proc/mounts');
	$usbmounts = preg_grep('#\s/[^/]+/usb\d+\s#', $mounts);
	foreach( $usbmounts AS $line ) {
		if( preg_match('#^/dev/(\D+)\d+\s+(/[^/]+/usb\d+)\s#', $line, $matches) ) {
			$dev = $matches[1];
			$mpoint = $matches[2];
			if( is_file("$mpoint/rifnetbackup.txt") ) {
				preg_match('#^(/dev/\D+\d+)\s+#', $line, $matches);
				$device = $matches[1];
				$vendor = file_get_contents("/sys/block/$dev/device/vendor");
				$model = file_get_contents("/sys/block/$dev/device/model");
				echo str_replace("\n", "", "$device^$mpoint^$vendor^$model")."\n";
				return $device;
			}
		}
	}
	return false;
}


/////
// Kör backup
/////
function start_backup($device)
{
	global $LOGFILE, $CONFFILE, $BACKUPLINE, $LOCKFILE, $USERNAME, $BASEDIR;
	global $children, $children_pipes, $shutdown_now;

        require "$BASEDIR/inc/rwINIfile.php";
	$errorbuf = '';

	// Skriv datum till logfil
	exec('date > '.$LOGFILE);

	// Läser conffil
	$conf = readINIfile ($CONFFILE, '#');

	$mounts = file('/proc/mounts');
	$mount = preg_grep('#^'.preg_quote($device).'\s/[^/]+/usb\d+\s#', $mounts);
	if( ! preg_match('#\s(/[^/]+/usb\d+)\s#', array_pop($mount), $matches) ) {
		die("Can't find mountpoint\n");
	}
	$mountpoint = $matches[1];

	// Tolkar conffil, vilka filer ska backupas?
	if( is_array( $conf['included_files']) ) {
		foreach( $conf['included_files'] AS $line ) {
			$BACKUPLINE = $BACKUPLINE.' --include "'.$line.'"';
		}
	}
		// systeminställningar
	if( isset($conf['data']['include_system'] ) ) {
		  // slapd, användardatabas
		exec('/usr/sbin/slapcat | gzip -9 > /var/backups/slapcat.txt.gz');
		$BACKUPLINE = $BACKUPLINE.' --include "/etc" --include "/var/backups" --include "/root"';
	}
		// cyrus-mail
	if( isset($conf['data']['include_mail'] ) ) {
		$BACKUPLINE = $BACKUPLINE.' --include "/var/spool/cyrus" --include "/var/lib/cyrus"';
	}
	if( isset($conf['data']['include_groupware'] ) ) {
		  // mysql, horde
		exec('mysqldump -p`cat /etc/mysql.secret` --all-databases --add-drop-database --add-drop-table --add-locks --allow-keywords --disable-keys --extended-insert --force --lock-tables | gzip -9 > /var/backups/mysqldump.sql.gz');
		$BACKUPLINE = $BACKUPLINE.' --include "/var/backups/mysqldump.sql.gz"';
	}

	// Tolkar conffil, hur länge backup ska sparas
	if( isset($conf['data']['remove_older_than'] ) )
		$remove_older_than = $conf['data']['remove_older_than'];
	else
		$remove_older_than = "NEVER";

	$mounts = file_get_contents('/proc/mounts');
	// Starta backup
	if( preg_match('#^'.preg_quote($device).'\s+'.$mountpoint.'\s#m', $mounts) ) {
		// Kontrollerar så att en backuprunda inte redan körs
                $fp = fopen($LOCKFILE, 'a+');
		if( !flock($fp, LOCK_EX | LOCK_NB) ) {
			echo "ERROR: usb_rdiff_wwwadmin körs redan\n";
			file_put_contents($LOGFILE, "ERROR: usb_rdiff_wwwadmin körs redan\n", FILE_APPEND);
			sendmail("Fel under backupkörning", "Backupkörningen kunde inte startas då en annan redan pågick.");
			exit(1);
		}
		if( !is_dir($mountpoint.'/bkp') ) {
			mkdir($mountpoint.'/bkp', 0700);
		}
		else {
			// Kontrollerar så att trasig första backup inte ligger i vägen
			if( is_dir($mountpoint.'/bkp/rdiff-backup-data') && !is_file($mountpoint.'/last_run_sucess') ) {
				exec("/usr/bin/rdiff-backup --check-destination-dir $mountpoint/bkp", $out, $ret );
				if( $ret!=0 && count(preg_grep('#^Fatal Error: Bad rdiff-backup-data dir on destination side$#', $out))==0 ) {
					file_put_contents($LOGFILE, "WARNING: rdiff-backup-data-katalog existerar trots ingen backup ännu skett, flyttar ur vägen\n", FILE_APPEND);
					echo "WARNING: rdiff-backup-data-katalog existerar trots ingen backup ännu skett, flyttar ur vägen\n";
					passthru("/bin/mv $mountpoint/bkp/rdiff-backup-data $mountpoint/rdiff-backup-data.old");
				}
				else {
					file_put_contents($LOGFILE, "WARNING: '$mountpoint/last_run_sucess' finns inte men rdiff-backup verkar ha lyckats med minst en backuprunda\n", FILE_APPEND);
					echo "WARNING: '$mountpoint/last_run_sucess' finns inte men rdiff-backup verkar ha lyckats med minst en backuprunda\n";
				}
			}

		}

		file_put_contents($LOGFILE, "RUN: /usr/bin/unbuffer $BACKUPLINE --exclude '**' / \"$mountpoint/bkp/\"\n", FILE_APPEND);

		//Starta rdiff-backup
		$descriptorspec = array(
			0 => array("pipe", "r"),  // stdin
			1 => array("file", $LOGFILE, "a"),  // stdout
			2 => array("pipe", "w") // stderr
		);
		//$children['rdiff'] = proc_open( '/usr/bin/unbuffer '.$BACKUPLINE.' --exclude \'**\' / "'.$mountpoint.'/bkp/"', $descriptorspec, $children_pipes['rdiff']);
		$children['rdiff'] = proc_open( $BACKUPLINE.' --exclude \'**\' / "'.$mountpoint.'/bkp/"', $descriptorspec, $children_pipes['rdiff']);
		fclose($children_pipes['rdiff'][0]);
		$stat = proc_get_status( $children['rdiff'] );
		$running = $stat['running'];
		while( $running ) {
			$stat = proc_get_status( $children['rdiff'] );

			//hitta felmeddelanden
			$read = array( $children_pipes['rdiff'][2] );
			if (false === ($num_changed_streams = stream_select($read, $write = NULL, $except = NULL, 1)))  {
				echo "Fel med strömmar och select\n";
				exit;
			}
			else if ($num_changed_streams > 0) {
				foreach( $read AS $line ) {
					$str = fgets($line, 1024);
					echo $str;
					file_put_contents($LOGFILE, "$str", FILE_APPEND);
					$errorbuf .= $str;
				}
			}
			$running = $stat['running'];
		}
		echo "\nAvslutat\n";
		echo "dödar barn\n";
		fclose($children_pipes['rdiff'][2]);
		echo "close: rdiff... ";
		proc_close( $children['rdiff'] );
                unlink($LOCKFILE);
                flock($fp, LOCK_UN);
                fclose($fp);
		echo "done\n";

		if( ($ret = $stat['exitcode']) == 0 ) {
			// Backuprunda lyckades, touch:ar fil
			touch("$mountpoint/last_run_sucess");
			// Finns backup på rdiff-backup-data så raderas denna
			if( is_dir("$mountpoint/rdiff-backup-data.old") ) {
				file_put_contents($LOGFILE, "Raderar $mountpoint/rdiff-backup-data.old\n", FILE_APPEND);
				echo "Raderar $mountpoint/rdiff-backup-data.old\n";
				passthru("/bin/rm -r --preserve-root $mountpoint/rdiff-backup-data.old");
			}
			if( $remove_older_than != "NEVER") {
				// Raderar äldre än angiven tid
				echo "Remove older than $remove_older_than\n";
				file_put_contents($LOGFILE, "Remove older than $remove_older_than\n", FILE_APPEND);
				exec( 'rdiff-backup -v6 --force --remove-older-than '.$remove_older_than.' "'.$mountpoint.'/bkp/" >> '.$LOGFILE.' 2>&1' );
				echo "done\n";
			}
		}
		else {
			echo "ERROR: return $ret\n";
			file_put_contents($LOGFILE, "ERROR: return $ret\n", FILE_APPEND);
			if( preg_match('#\[Errno 5\] Input/output error#', $errorbuf) )
				sendmail("Fel under backupkörning", "Tappade kontakten med backup-enheten, sitter kabeln i ordentligt?");
			else if( preg_match('#Fatal Error\: Killed with signal 15#', $errorbuf) )
				sendmail("Den automatiska backupkörningen blev avbruten", "Någon eller något avbröt USB-backupkörningen.");
			else if( preg_match('#IOError\: \[Errno 28\] No space left on device#', $errorbuf) )
				sendmail("Fel under backupkörning", "Utrymmet är slut på backupdisken.");
			else
				sendmail("Fel under backupkörning", "Okänt fel skedde under backupkörning. Kontrollera att kabel mellan usb-hårddisk och server sitter i ordentligt och starta därefter en ny backupkörning.\n Ta kontakt med support om problemen fortgår så hjälper de dig.\n\n\n\n\n\n\n\nFelsökningsdata för supporten:\nreturnnr: $ret\nmsg:\n$errorbuf");
		}
		file_put_contents($LOGFILE, "Done\n", FILE_APPEND);
	}

	// Om montering försvann, meddela
	else {
		echo "ERROR: montering försvann innan backup\n";
		file_put_contents($LOGFILE, "ERROR: mount\n", FILE_APPEND);
		sendmail("Fel under backup", "Tappade kontakten med USB-enhet.");
	}
}


/////
// Hämtar filer från backup
/////
function restore_backup( $device )
{
	global $argc, $argv, $LOCKFILE;

	$search  = array( '#^(/home)/#', '#^(/var/shares)/#' );
	$replace = array( 'Hemkataloger/', 'Fildelningar/' );

	echo "RESTORE\n";

	$mounts = file_get_contents('/proc/mounts');
	if( preg_match('#^'.preg_quote($device).'\s+(/[^/]+/usb\d+)\s#m', $mounts, $matches) ) {
		// Kontrollerar så att en backuprunda inte redan körs
		$fp = fopen($LOCKFILE, 'a+');
		if( !flock($fp, LOCK_EX | LOCK_NB) ) {
			echo "ERROR: usb_rdiff_wwwadmin körs redan\n";
			file_put_contents($LOGFILE, "ERROR: usb_rdiff_wwwadmin körs redan\n", FILE_APPEND);
			sendmail("Fel under backupkörning", "Återställningen kunde inte startas då backupkörning redan pågår.");
			exit(1);
		}
		$mpoint = $matches[1];
		$time = $argv[2];
		$target = $argv[$argc-1];

		if( ! is_dir($target) )
			mkdir($target);
		if( is_numeric($time) && $time > 0 )
			$timename = date("Y-m-d H_i", $time);
		else
			$timename = date("Y-m-d H_i");
		if( ! is_dir($target.$timename) )
			mkdir($target.$timename);

		if( is_dir($target.$timename) ) {
			for( $i=3; $i < ($argc-1); $i++ ) {
				$source = $argv[$i];
				preg_match('#([^/]+/?)$#', $source, $matches);
				$filename = $matches[1];
				$sourcename = preg_replace($search, $replace, $source);
				echo "DO: $target$timename/$filename\n";
				exec("rdiff-backup --force -r $time \"$mpoint/bkp/$source\" \"$target$timename/$filename\"");
			}
			exec("chmod --preserve-root -R 777 \"$target\"");
			echo "Done!\n";
		}
		else {
			echo "ERROR: can't create restoredir\n";
                }
                unlink($LOCKFILE);
                flock($fp, LOCK_UN);
                fclose($fp);
	}
}


/////
// Återställer system eller utvalda delar till vald tidpunkt
/////
function revert_backup( $device )
{
	global $argc, $argv;

	echo "RESTORE\n";

	$mounts = file_get_contents('/proc/mounts');
	if( preg_match('#^'.preg_quote($device).'\s+(/[^/]+/usb\d+)\s#m', $mounts, $matches) ) {
		$mpoint = $matches[1];
		$time = $argv[2];
		$flags = $argv[3];

	    //Systeminställningar
		if( preg_match('#^-.*c#', $flags) ) {
			echo "DO: Systeminställningar\n";

			// skapar tmp-filer
			$tmpfnamegz = tempnam(false, "usb-backup.gz");
			$tmpfnametxt = tempnam(false, "usb-backup.txt");

			// hämtar komprimerade användardatabasen
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/var/backups/slapcat.txt.gz\" \"$tmpfnamegz\"", $retrdiff);
			// packar upp databas
			passthru("/bin/gzip -c -S '' -d $tmpfnamegz > $tmpfnametxt", $retgzip);
			if( $retrdiff == 0 && $retgzip == 0 ) {
				passthru('PATH=/sbin:"${PATH}"; /etc/init.d/inetd stop');
				// kopierar nuvarande /etc till tmp-katalog
				passthru('cp -a /etc/ /etc.old.wwwadmin');
				// återställer /etc
				passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/etc/\" \"/etc/\"", $ret);
				if( $ret == 0 ) {
					// stoppar användardatabasmotorn
					passthru('PATH=/sbin:"${PATH}"; /etc/init.d/slapd stop');
					// flyttar nuvarande användardatabas till tmp-katalog
					passthru('mv /var/lib/ldap/ /var/lib/ldap.old.wwwadmin');
					mkdir('/var/lib/ldap/');
					// fyller på ny data till användardatabasen
					passthru("/usr/sbin/slapadd -l $tmpfnametxt");
					// startar användardatabasen
					passthru('PATH=/sbin:"${PATH}"; /etc/init.d/slapd start', $ret);
					// raderar tmp-katalog för gamla användardatabasen & etc om lyckad uppstart, annars flytta tillbaka
					if( $ret == 0 ) {
						passthru('rm -r --preserve-root /var/lib/ldap.old.wwwadmin');
						passthru('rm -r --preserve-root /etc.old.wwwadmin');
					}
					else {
						echo "ERROR: lyckades inte starta slapd med backupens databas, flyttar tillbaka orginalfiler\n";
						if( is_dir('/var/lib/ldap') )
							passthru('rm -r --preserve-root /var/lib/ldap/');
						passthru('mv /var/lib/ldap.old.wwwadmin/ /var/lib/ldap');
						passthru('cp -a /etc.old.wwwadmin/ /etc/');
						passthru('rm -r --preserve-root /etc.old.wwwadmin/');
						passthru('PATH=/sbin:"${PATH}"; /etc/init.d/slapd start', $ret);
					}
				}
				else {
					echo "ERROR: kunde ej återställa /etc\n";
					passthru('cp -a /etc.old.wwwadmin/ /etc/');
					rmdir('rm -r --preserve-root /etc.old.wwwadmin/');
				}
				passthru('PATH=/sbin:"${PATH}"; /etc/init.d/inetd start');
			}
			else
				echo "ERROR: kunde ej återställa användardatabas\n";

			// raderar tmp-filer
			unlink($tmpfnamegz);
			unlink($tmpfnametxt);
		}

	    //Mail
		if( preg_match('#^-.*m#', $flags) ) {
			echo "DO: Mail\n";

			// stoppar cyrus
			passthru('/etc/init.d/cyrus2.2 stop');
			// flyttar nuvarande mailfiler till tmp-katalog
			passthru('mv  /var/spool/cyrus/ /var/spool/cyrus.old.wwwadmin');
			passthru('mv  /var/lib/cyrus/ /var/lib/cyrus.old.wwwadmin');
			// återställer mailfiler
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/var/spool/cyrus/\" \"/var/spool/cyrus/\"", $retspool);
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/var/lib/cyrus/\" \"/var/lib/cyrus/\"", $retlib);
			if( $retspool == 0 && $retlib == 0 ) {
				// startar cyrus
				passthru('/etc/init.d/cyrus2.2 start', $retcyrus);
			}
			if( $retspool == 0 && $retlib == 0 && $retcyrus == 0 ) {
				passthru('rm -r --preserve-root /var/spool/cyrus.old.wwwadmin');
				passthru('rm -r --preserve-root /var/lib/cyrus.old.wwwadmin');
			}
			else {
				echo "ERROR: lyckades inte starta mailserver med backupens mailfiler, flyttar tillbaka orginalfiler\n";
				if( is_dir('/var/spool/cyrus') )
					passthru('rm -r --preserve-root /var/spool/cyrus');
				if( is_dir('/var/lib/cyrus') )
					passthru('rm -r --preserve-root /var/lib/cyrus');
				passthru('mv /var/spool/cyrus.old.wwwadmin/ /var/spool/cyrus');
				passthru('mv /var/lib/cyrus.old.wwwadmin/ /var/lib/cyrus');
				passthru('/etc/init.d/cyrus2.2 start', $retcyrus);
			}
		}

	    //Groupware
		if( preg_match('#^-.*g#', $flags) ) {
			echo "DO: Groupware\n";

			// skapar tmp-fil
			$tmpfnamegz = tempnam(false, "usb-backup.gz");
			$tmpfnamesql = tempnam(false, "usb-backup.sql");

			// hämtar komprimerade databasen
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/var/backups/mysqldump.sql.gz\" \"$tmpfnamegz\"", $retrdiff);
			// packar upp databas
			passthru("/bin/gzip -c -S '' -d $tmpfnamegz > $tmpfnamesql", $retgzip);
			if( $retrdiff == 0 && $retgzip == 0 ) {
				passthru("mysql --user=root --password=`cat /etc/mysql.secret` < $tmpfnamesql", $ret);
				if( $ret != 0 )
					echo "ERROR: fel vid inläsning av databas\n";
			}
			else
				echo "ERROR: kunde ej återställa groupware\n";

			// raderar tmp-fil
			unlink($tmpfnamegz);
			unlink($tmpfnamesql);
		}

	    //Home
		if( preg_match('#^-.*h#', $flags) ) {
			echo "DO: Hemkataloger\n";

			// flyttar nuvarande kataloger till tmp-katalog
			passthru('mv /home/ /home.old.wwwadmin');
			// återställer kataloger
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/home/\" \"/home/\"", $rethome);
			if( $rethome == 0 ) {
				passthru('rm -r --preserve-root /home.old.wwwadmin');
			}
			else {
				echo "ERROR: lyckades inte återställa hemkataloger, flyttar tillbaka orginalfiler\n";
				if( is_dir('/home') )
					passthru('rm -r --preserve-root /home');
				passthru('mv /home.old.wwwadmin/ /home');
			}
		}

	    //Shares
		if( preg_match('#^-.*s#', $flags) ) {
			echo "DO: Fildelningar\n";

			// flyttar nuvarande kataloger till tmp-katalog
			passthru('mv /var/shares/ /var/shares.old.wwwadmin');
			// återställer kataloger
			passthru("/usr/bin/rdiff-backup --force -r $time \"$mpoint/bkp/var/shares/\" \"/var/shares/\"", $retshares);
			if( $retshares == 0 ) {
				passthru('rm -r --preserve-root /var/shares.old.wwwadmin');
			}
			else {
				echo "ERROR: lyckades inte återställa fildelningar, flyttar tillbaka orginalfiler\n";
				if( is_dir('/var/shares') )
					passthru('rm -r --preserve-root /var/shares');
				passthru('mv /var/shares.old.wwwadmin/ /var/shares');
			}
		}
		echo "Done!\n";
	}
}


/////
// Raderar rdiff-backup -datakatalog
/////
function fix_backupdevice( $device )
{
	$mounts = file_get_contents('/proc/mounts');
	if( preg_match('#^'.preg_quote($device).'\s+(/[^/]+/usb\d+)\s#m', $mounts, $matches) ) {
		$mpoint = $matches[1];
		if( is_dir( $mpoint."/bkp/rdiff-backup-data" ) )
			exec("rm --preserve-root -f -r $mpoint/bkp/rdiff-backup-data");
	}
}


/////
// Återställer rdiff-backup-data efter felaktig backup
/////
function check_backup( $device )
{
	$mounts = file_get_contents('/proc/mounts');
	if( preg_match('#^'.preg_quote($device).'\s+(/[^/]+/usb\d+)\s#m', $mounts, $matches) ) {
		$mpoint = $matches[1];
		passthru("/usr/bin/rdiff-backup -v 6 --check-destination-dir $mpoint/bkp/");
	}
}


/////
// Listar alla usb-enheter
/////
function get_devlist()
{
	$ret = array();
	$mounts = file('/proc/mounts');
	$usbmounts = preg_grep('#\s/[^/]+/usb\d+\s#', $mounts);
	foreach( $usbmounts AS $line ) {
		if( preg_match('#^/dev/(\D+)\d+\s+/[^/]+/usb\d+\s#', $line, $matches) ) {
			$dev = $matches[1];
			preg_match('#^(/dev/\D+\d+)\s+#', $line, $matches);
			$device = $matches[1];
			$vendor = file_get_contents("/sys/block/$dev/device/vendor");
			$model = file_get_contents("/sys/block/$dev/device/model");

			$str = str_replace("\n", "", "$device^$vendor^$model");
			$ret[] = array('device' => trim($device), 'vendor' => trim($vendor), 'model' => trim($model));
			echo $str."\n";
		}
	}
	return $ret;
}



/////
// gör ansluten usb-enhet till backupdisk (rensar och ger den 'rifnetbackup.txt'-fil)
/////
function do_backupdevice( $device )
{
    global $LOCKFILE_CREATE;

    $fp = fopen($LOCKFILE_CREATE, 'a+');
    if( flock($fp, LOCK_EX | LOCK_NB) ) {
        $mounts = file_get_contents('/proc/mounts');
        if( preg_match('#^'.preg_quote($device).'\s+(/[^/]+/usb\d+)\s#m', $mounts, $matches) ) {
            $mpoint = $matches[1];

            exec("/bin/umount $device");
            exec("/sbin/mkfs.ext3 -m 0 -q $device");
            exec("/bin/mount -o async,noexec,nodev,noatime $device $mpoint");

            // Stoppa in fil som gör enheten till backupenhet
            file_put_contents("$mpoint/rifnetbackup.txt", "Den här filen talar om för server att enheten ska ses som en backup-enhet");
        }
        unlink($LOCKFILE_CREATE);
        flock($fp, LOCK_UN);
        fclose($fp);
    }
    else {
        echo "FEL: Kunde ej skapa lås";
        die(1);
    }
}


declare(ticks = 1);
function sig_handler( $sig_nr ) {
        switch ($sig_nr) {
        case SIGTERM:
        case SIGINT:
		echo "Fick signal: $sig_nr\n";
                exit;
                break;
        default:
                echo "Fick okänd signal: $sig_nr\n";
		exit;
                break;
        }
}




///////////////

if( $argc < 2 ) {
	echo "\nSkapat för anrop från webgränsnitt\n";
	echo "backup | check | list | restore | revert | device | setdevice\n";
	die();
}

set_time_limit (0);
//register_shutdown_function('shutdown');
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGINT, 'sig_handler');

//Fulaktiverar autofs-enheter som ligger under /mnt
is_file("/mnt/usb0/rifnetbackup.txt");
is_file("/mnt/usb1/rifnetbackup.txt");

switch( $argv[1] ) {
case 'backup':
	if( ($device = get_backupdevice()) ) {
		start_backup( $device );
	}
	else {
		echo "not connected\n";
		sendmail("Automatisk backup kunde ej genomföras då backup-hårddisken ej är ansluten", "Det här är ett automatiskt meddelande från din server\nBackupen kunde inte genomföras då backuphårddisken inte kunde hittas. Kontrollera att en extern USB-hårddisk är ansluten, den är igång och aktiverad som en backupenhet.");
	}
	break;
case 'check':
	if( ($device = get_backupdevice()) ) {
		check_backup( $device );
	}
	else {
		echo "not connected\n";
	}
	break;
case 'list':
	if( count(get_devlist()) == 0 )
		echo "no connected\n";
	break;
case 'restore':
	if( ($device = get_backupdevice()) )
		restore_backup( $device );
	break;
case 'revert':
	if( ($device = get_backupdevice()) )
		revert_backup( $device );
	break;
case 'device':
	if( ! get_backupdevice() )
		echo "not connected\n";
	break;
case 'setdevice':
	$dev_arr = get_devlist();
	// enbart om det finns exakt en usbenhet ansluten
	if( count($dev_arr) == 1 ) {
		do_backupdevice( $dev_arr[0]['device'] );
	}
	break;
default:
	echo "\nSkapat för anrop från webgränsnitt\n";
	echo "backup | check | list | restore | revert | device | setdevice\n";
	die();
	break;
}
?>
